import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.text.DecimalFormat;

public class ShoppingCartApp {
    public static void main(String[] args){
        ArrayList<Item> existedItems=new ArrayList<>();
        init(existedItems);
        int function;
        existedItems.add(new Book("三体",30,1,"科幻类"));
        ShoppingCart shoppingCart=new ShoppingCart();
        Scanner in=new Scanner(System.in);
        System.out.println("欢迎使用购物车");
            while (true){
                System.out.println("请选择一个功能吧。（1-查看这个商店卖什么，2-查看我的购物车，3-添加物品，4-删除物品，5-结算并离开商场）");
                try {
                    function=in.nextInt();
                    if(function!=1&&function!=2&&function!=3&&function!=4&&function!=5){
                        System.out.println("请输入1、2、3、4、5五个数的其中之一");
                        continue;
                    }
                }catch (InputMismatchException e){
                    System.out.println("请输入1、2、3、4、5五个数的其中之一");
                    in.nextLine();
                    continue;
                }
                switch (function){
                    case 1:{
                        for(Item i:existedItems){
                            System.out.println("商品名："+i.getName()+"，单价："+i.getPrice());
                        }
                        break;
                    }
                    case 2:{
                        list(shoppingCart);
                        break;
                    }
                    case 3:{
                        add(existedItems,shoppingCart);
                        break;
                    }
                    case 4:{
                        delete(shoppingCart);
                        break;
                    }
                    case 5:{
                        System.out.println("确定吗？不再逛一逛吗？ 1-走了走了  2-再逛一会");
                        while (true) {
                            int option;
                            try {
                                option = in.nextInt();
                                if (option != 1 && option != 2) {
                                    System.out.println("请输入1、2五个数的其中之一");
                                    continue;
                                }
                            } catch (InputMismatchException e) {
                                System.out.println("请输入1、2五个数的其中之一");
                                in.nextLine();
                                continue;
                            }
                            if(option==1){
                                if (shoppingCart.getItems().isEmpty()){
                                    System.out.println("购物车里没有物品，欢迎再次光临");
                                    return;
                                }
                                else {
                                    DecimalFormat df = new DecimalFormat("#.00");
                                    String formatted = df.format(checkPrice(shoppingCart));
                                    System.out.println("您一共消费了" + formatted + "元，欢迎再次光临");
                                    return;
                                }
                            }
                            else {
                                break;
                            }
                        }
                        break;
                    }
                }
            }
    }
    public static void init(ArrayList<Item> arrayList){         //初始化商品
        arrayList.add(new Book("三体",43.8,1,"科幻类"));
        arrayList.add(new Book("平凡的世界",54.78,1,"现实主义题材"));
        arrayList.add(new Food("苹果",3,1,true));
        arrayList.add(new Food("矿泉水",1,1,true));
        arrayList.add(new Food("汉堡",15,1,false));
        arrayList.add(new Medicine("复方对乙酰氨基酚",20,1,"甲类OTC"));
        arrayList.add(new Medicine("盒装创可贴",8.7,1,"乙类OTC"));
    }
    public static void add(ArrayList<Item> arrayList,ShoppingCart shoppingCart){      //这个arraylist原则上应该接受已有商品列表，就是上面init()里边的，对应main()中的existedItems
        Scanner in=new Scanner(System.in);
        String input;
        while(true) {       //先输入商品名，检索的事在后面。
            System.out.println("请输入想要的商品");
            try {
                input=in.next();
            }catch (InputMismatchException e){
                System.out.println("你貌似输入的不是一个商品名");
                in.nextLine();
                continue ;
            }
            break ;         //如果输入格式不对就到不了这句话，也就是实现了只有正确的输入才能进行下一步
        }
        for (Item i:arrayList){
            if (i.getName().equals(input)){         //找找有没有商品
                System.out.println("已经找到该商品："+i.getName()+"，请问你要买几个？");
                while (true){
                    int num;        //经过考虑，买的数量放到这当形参即可
                    try {
                        num = in.nextInt();
                        if(num <=0){                 //防止输入0、-1、-2这类
                            System.out.println("请输入正整数。");
                            continue;
                        }
                    } catch (InputMismatchException e) {        //防止输入 1.5、“字符” 这类
                            System.out.println("请输入整数。");
                            in.nextLine();
                            continue;
                    }
                    for(Item j : shoppingCart.getItems()){     //检测有没有重复的，毕竟不能一看收款单满屏幕都是同一个商品
                        try {
                            if (j.equals(i)) {
                                System.out.println("您的购物车里已经有" + i.getName() + "了，已为您自动加" + num + "个");
                                j.setNumber(j.getNumber() + num);
                                return;
                            }
                        }catch (ClassCastException e){
                            if (j.getName().equals(i.getName())) {
                                System.out.println("您的购物车里已经有" + i.getName() + "了，已为您自动加" + num + "个");
                                j.setNumber(j.getNumber() + num);
                                return;
                            }
                        }
                    }
                    shoppingCart.add(i,num);//没有重复的，把这个加进去
                    return;
                }
            }
        }
        System.out.println("没有找到该商品");
    }
    public static void list(ShoppingCart shoppingCart){
        System.out.println(shoppingCart);
    }
    public static void delete(ShoppingCart shoppingCart){
        if(shoppingCart.getItems().isEmpty()){
            System.out.println("购物车里没有物品");
            return;
        }
        Scanner in=new Scanner(System.in);
        String input;
        while(true) {       //先输入商品名，检索的事在后面。
            System.out.println("请输入想要删除的商品");
            try {
                input=in.next();
            }catch (InputMismatchException e){
                System.out.println("你貌似输入的不是一个商品名");
                in.nextLine();
                continue ;
            }
            break ;         //这个跟add函数的逻辑差不多
        }
        for(Item i: shoppingCart.getItems()){
            if(i.getName().equals(input)){
                int num;
                System.out.println("已经找到商品，信息如下："+i);
                System.out.println("你要删除多少个？");
                while (true) {
                    try {
                        num = in.nextInt();
                        if(num<=0){
                            System.out.println("你必须输入正数");
                            continue;
                        }
                        if(num> i.getNumber()){
                            System.out.println("你输入的数字大于该商品的现有数量，已默认设为最大值");
                            num= i.getNumber();
                        }
                    } catch (InputMismatchException e) {
                        System.out.println("你必须输入正整数");
                        in.nextLine();
                        continue;
                    }
                    System.out.println("你即将删除"+num+"个"+i.getName());
                    System.out.println("此举会删除购物车内一定数量的该商品，确定要这么做吗？（1-是  2-否）");
                    while (true) {
                        try {
                            int ans = in.nextInt();
                            if (ans!=1&&ans!=2){
                                System.out.println("你必须输入1、2中的一个");
                                continue;
                            }
                        }catch (InputMismatchException e){
                            System.out.println("你必须输入1、2中的一个");
                            continue;
                        }
                        if(num>= i.getNumber()){
                            shoppingCart.Delete(i);
                        }
                        else {
                            i.setNumber(i.getNumber()-num);
                        }
                        return;
                    }
                }
            }
        }
        System.out.println("没有找到该商品。");
    }
    public static double checkPrice(ShoppingCart shoppingCart){         //总价格
        double sum=0;
        for(Item item: shoppingCart.getItems()){
            sum+= item.getNumber()* item.getPrice();
        }
        return sum;
    }
}
